package com.example.demo.util;

import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * @description：ftp工具类.
 * @remark fpt server 下载地址：https://www.filezilla.cn/download/server
 * @author：lw
 * @create_time：2024/2/7
 **/
public class FtpUtil {
    private static final String FTP_HOST = "localhost";
    private static final int FTP_PORT = 21; // 默认端口是21，根据实际情况调整
    private static final String FTP_USER = "root";
    private static final String FTP_PASSWORD = "123456";

    public static boolean uploadFile(String localFilePath, String remoteDirectory, String fileNameOnServer) {
        try {
            FTPClient ftpClient = new FTPClient();
            ftpClient.connect(FTP_HOST, FTP_PORT);
            ftpClient.login(FTP_USER, FTP_PASSWORD);

            // 设置以二进制方式传输数据
            ftpClient.setFileType(FTP.BINARY_FILE_TYPE);

            // 指定的远程目录不存在则创建
            if (!remoteDirectory.isEmpty()) {
                ftpClient.changeWorkingDirectory(remoteDirectory);
            }

            // 创建输入流指向本地文件
            File localFile = new File(localFilePath);
            FileInputStream fis = new FileInputStream(localFile);

            // 将本地文件上传到服务器
            boolean success = ftpClient.storeFile(fileNameOnServer, fis);

            // 关闭输入流和FTP连接
            fis.close();
            ftpClient.logout();
            ftpClient.disconnect();

            return success;
        } catch (IOException e) {
            throw new RuntimeException("Failed to upload file via FTP："+e.getMessage());
        }
    }

    public static void downloadFile(String remoteFilePath, String localSavePath) {
        try {
            FTPClient ftpClient = new FTPClient();
            ftpClient.connect(FTP_HOST, FTP_PORT);
            ftpClient.login(FTP_USER, FTP_PASSWORD);

            // 设置以二进制方式传输数据
            ftpClient.setFileType(FTP.BINARY_FILE_TYPE);

            // 切换到包含远程文件的目录
            ftpClient.changeWorkingDirectory(new File(remoteFilePath).getParent());

            // 创建本地输出文件
            File localFile = new File(localSavePath);
            FileOutputStream fos = new FileOutputStream(localFile);

            // 从FTP服务器下载文件到本地
            ftpClient.retrieveFile(new File(remoteFilePath).getName(), fos);

            // 关闭输出流和FTP连接
            fos.close();
            ftpClient.logout();
            ftpClient.disconnect();
        } catch (IOException e) {
            throw new RuntimeException("Failed to download file via FTP", e);
        }
    }
}


/*
FTP（File Transfer Protocol，文件传输协议）是一种基于TCP/IP网络的协议，主要用于在互联网上的计算机之间进行文件传输。它允许用户通过FTP客户端软件将本地文件上传到远程FTP服务器上，或从FTP服务器下载文件到本地计算机。以下是FTP的主要功能和作用：

文件传输：FTP的核心功能是实现可靠、高效的文件上传和下载服务。用户可以通过FTP客户端与FTP服务器建立连接，从而实现数据的双向交换。

身份验证：FTP服务器要求用户提供用户名和密码进行身份验证。只有经过授权的用户才能访问服务器上的文件和目录。

文件管理：用户可以使用FTP进行文件和目录的创建、删除、重命名、移动以及组织等操作，前提是在FTP服务器上拥有相应的权限。

匿名访问：某些FTP服务器还支持匿名访问模式，允许用户无需提供账户凭据即可登录，并访问特定的公共文件夹。

目录导航：用户可以在FTP服务器上浏览目录结构，查找并选择需要操作的文件。

大文件传输：FTP协议设计时考虑到了大文件的传输需求，支持断点续传等功能，确保文件在传输过程中即使出现中断也能从上次断开的地方继续传输。

FTP在早期互联网发展中起到了重要作用，尽管现在许多文件共享和传输任务已经被HTTP(S)、云存储服务和其他现代技术替代，但在大量文件管理和备份场景中，FTP仍然被广泛应用于企业和个人用户的文件传输工作流中。
*/
